From f8391b72398dd254da3442fb0729f1ff258470b8 Mon Sep 17 00:00:00 2001 From: "kaf24@localhost.localdomain" Date: Sun, 26 Nov 2006 17:35:00 +0000 Subject: [PATCH] [XEN] Fix emulator EA calculation for LODS/STOS. Signed-off-by: Keir Fraser --- xen/arch/x86/x86_emulate.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/x86_emulate.c b/xen/arch/x86/x86_emulate.c index 2f0abf8dd5..41ac06528c 100644 --- a/xen/arch/x86/x86_emulate.c +++ b/xen/arch/x86/x86_emulate.c @@ -1007,23 +1007,25 @@ x86_emulate_memop( goto done; ea = register_address(*seg, _regs.esi); } + page_boundary_test(); register_address_increment( _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); register_address_increment( _regs.edi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); - page_boundary_test(); break; case 0xaa ... 0xab: /* stos */ + ea = register_address(_regs.es, _regs.edi); + page_boundary_test(); dst.type = OP_MEM; dst.bytes = (d & ByteOp) ? 1 : op_bytes; dst.ptr = (unsigned long *)cr2; dst.val = _regs.eax; register_address_increment( _regs.edi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); - ea = register_address(_regs.es, _regs.edi); - page_boundary_test(); break; case 0xac ... 0xad: /* lods */ + ea = register_address(*seg, _regs.esi); + page_boundary_test(); dst.type = OP_REG; dst.bytes = (d & ByteOp) ? 1 : op_bytes; dst.ptr = (unsigned long *)&_regs.eax; @@ -1031,8 +1033,6 @@ x86_emulate_memop( goto done; register_address_increment( _regs.esi, (_regs.eflags & EFLG_DF) ? -dst.bytes : dst.bytes); - ea = register_address(*seg, _regs.esi); - page_boundary_test(); break; } goto writeback; -- 2.30.2